<?php
class banco_model extends CI_Model{
	
	function __construct(){
		parent::__construct();
	}
	
	/**
	 * Obtiene el listado de cuentas paginados
	 */
	public function obtenCuentas($per_page='30'){
		$sql = '';
		//paginacion
		$params = array(
			'result_items_per_page' => $per_page,
			'result_page' => (isset($_GET['pag'])? $_GET['pag']: 0)
		);
		if($params['result_page'] % $params['result_items_per_page'] == 0)
			$params['result_page'] = ($params['result_page']/$params['result_items_per_page']);
		
		//Filtros para buscar
		if($this->input->get('fnombre') != '')
			$sql = " AND lower(nombre) LIKE '%".mb_strtolower($this->input->get('fnombre'), 'UTF-8')."%'";
		
		$query = BDUtil::pagination("
			SELECT id_cuenta, numero, nombre
			FROM banco_cuentas
			WHERE status = 'ac'".$sql."
			ORDER BY nombre ASC
		", $params, true);
		$res = $this->db->query($query['query']);
		
		$response = array(
			'cuentas' => array(),
			'total_rows' 		=> $query['total_rows'],
			'items_per_page' 	=> $params['result_items_per_page'],
			'result_page' 		=> $params['result_page']
		);
		if($res->num_rows() > 0)
			$response['cuentas'] = $res->result();
		
		return $response;
	}
	
	/**
	 * Obtiene toda la informacion de un privilegio
	 * @param unknown_type $id
	 */
	public function getInfoCuenta($id){
		$res = $this->db
			->select('*')
			->from('banco_cuentas')
			->where("id_cuenta = '".$id."'")
		->get();
		if($res->num_rows() > 0)
			return $res->row();
		else
			return false;
	}
	
	/**
	 * Modifica la informacion de un privilegio
	 */
	public function updateCuenta(){
		$data = array(
			'nombre' => $this->input->post('dnombre'),
			'numero' => $this->input->post('dnumero')
		);
		$this->db->update('banco_cuentas', $data, "id_cuenta = '".$_GET['id']."'");
		return array(true, '');
	}
	
	/**
	 * Agrega una cuenta a la bd
	 */
	public function addCuenta(){
		$data = array(
			'id_cuenta' => BDUtil::getId(),
			'nombre' => $this->input->post('dnombre'),
			'numero' => $this->input->post('dnumero')
		);
		$this->db->insert('banco_cuentas', $data);
		return array(true, '');
	}
	
	/**
	 * Elimina una cuenta de la bd (cambia el status)
	 */
	public function deleteCuenta(){
		$this->db->update('banco_cuentas', array('status' => 'e'), "id_cuenta = '".$_GET['id']."'");
		return array(true, '');
	}
	
	
	
	/**
	 * ESTADOS DE CUENTA
	 * 
	 * obtiene el estado de una cuenta bancaria de acuerdo al rango de
	 * fechas
	 */
	public function getEstadoCuentaData($ceuntas=null){
		$sql = '';
	
		//Filtros para buscar
		$_GET['ffecha1'] = $this->input->get('ffecha1')==''? date("Y-m-").'01': $this->input->get('ffecha1');
		$_GET['ffecha2'] = $this->input->get('ffecha2')==''? date("Y-m-d"): $this->input->get('ffecha2');
		$fecha1 = $fecha2 = '';
		if($_GET['ffecha1'] > $_GET['ffecha2']){
			$fecha2 = $_GET['ffecha1'];
			$fecha1 = $_GET['ffecha2'];
		}else{
			$fecha2 = $_GET['ffecha2'];
			$fecha1 = $_GET['ffecha1'];
		}
		
		$id_cuenta = $this->input->get('fcuenta')!=''? 
			$this->input->get('fcuenta'): 
				(isset($ceuntas[0]->id_cuenta)? $ceuntas[0]->id_cuenta: '');
			
	
		/*** Saldo anterior ***/
		$saldo_anterior = $this->db->query("
			SELECT (
					SELECT COALESCE(SUM(monto), 0) 
					FROM get_banco_movimientos 
					WHERE tipo = 'en' AND id_cuenta = '".$id_cuenta."' 
						AND fecha < '".$fecha1."') AS ingreso,
				(
					SELECT COALESCE(SUM(monto), 0) 
					FROM get_banco_movimientos 
					WHERE tipo = 'sa' AND id_cuenta = '".$id_cuenta."' 
						AND fecha < '".$fecha1."') AS retiro
			");
	
	
		/*** Movimientos en el rango de fechas ***/
		$res = $this->db->query("
			SELECT * 
			FROM get_banco_movimientos
			WHERE id_cuenta = '".$id_cuenta."' 
				AND (fecha >= '".$fecha1."' AND fecha <= '".$fecha2."')
			ORDER BY fecha, id_movimiento ASC
			");
	
		$response = array(
			'movimientos' 	=> array(),
			'anterior'		=> array(),
			'fecha1' 		=> $fecha1,
			'id_cuenta'	=> $id_cuenta
		);
		if($res->num_rows() > 0)
			$response['movimientos'] = $res->result();
		if($saldo_anterior->num_rows() > 0)
			$response['anterior'] = $saldo_anterior->row();
	
		return $response;
	}
	
	/**
	 * Descarga el estado de una cuenta seleccionada en formato pdf
	 */
	public function estadoCuentaPdf(){
		$res = $this->getEstadoCuentaData();
		$inf_cuenta = $this->getInfoCuenta($res['id_cuenta']);
		
		if(isset($inf_cuenta->nombre)){
			$this->load->library('mypdf');
			// Creación del objeto de la clase heredada
			$pdf = new MYpdf('P', 'mm', 'Letter');
			$pdf->titulo2 = 'Estado de cuenta';
			$pdf->titulo3 = $inf_cuenta->nombre."\n";
			$pdf->titulo3 .=  'Del: '.$this->input->get('ffecha1')." Al ".$this->input->get('ffecha2');
			$pdf->AliasNbPages();
			//$pdf->AddPage();
			$pdf->SetFont('Arial','',8);
		
			$aligns = array('C', 'C', 'C', 'C', 'C', 'C');
			$widths = array(18, 62, 28, 28, 28, 40);
			$header = array('Fecha', 'Concepto', 'Ingreso', 'Retiro', 'Saldo', 'Cliente / Proveedor');
		
			$bad_saldo_ante = true;
			$total_saldo = $res['anterior']->ingreso - $res['anterior']->retiro;
			$total_ingreso = $total_retiro = 0;
		
			$res['anterior']->concepto = 'Saldo anterior al '.$res['fecha1'];
		
			foreach($res['movimientos'] as $key => $cuenta){
				$band_head = false;
				if($pdf->GetY() >= $pdf->limiteY || $key==0){ //salta de pagina si exede el max
					$pdf->AddPage();
		
					$pdf->SetFont('Arial','B',8);
					$pdf->SetTextColor(255,255,255);
					$pdf->SetFillColor(160,160,160);
					$pdf->SetX(6);
					$pdf->SetAligns($aligns);
					$pdf->SetWidths($widths);
					$pdf->Row($header, true);
				}
					
				$pdf->SetFont('Arial','',8);
				$pdf->SetTextColor(0,0,0);
				if($bad_saldo_ante){
					$pdf->SetX(6);
					$pdf->SetAligns($aligns);
					$pdf->SetWidths($widths);
					$pdf->Row(array('', $res['anterior']->concepto,
							'', '', String::formatoNumero($total_saldo), ''), false);
					$bad_saldo_ante = false;
				}
					
				$ingreso = $retiro = $cuenta->monto;
				if($cuenta->tipo == 'en'){
					$retiro = 0;
					$total_saldo += $cuenta->monto;
					$total_ingreso += $cuenta->monto;
				}else{
					$ingreso = 0;
					$total_saldo -= $cuenta->monto;
					$total_retiro += $cuenta->monto;
				}
				
				$datos = array($cuenta->fecha, 
						$cuenta->concepto, 
						String::formatoNumero($ingreso), 
						String::formatoNumero($retiro),
						String::formatoNumero($total_saldo), 
						$cuenta->nombre);
				
		
				$pdf->SetX(6);
				$pdf->SetAligns($aligns);
				$pdf->SetWidths($widths);
				$pdf->Row($datos, false);
			}
		
			$pdf->SetX(6);
			$pdf->SetFont('Arial','B',8);
			$pdf->SetTextColor(255,255,255);
			$pdf->SetWidths(array(80, 28, 28, 28));
			$pdf->Row(array('Totales:',
					String::formatoNumero($total_ingreso),
					String::formatoNumero($total_retiro),
					String::formatoNumero($total_saldo)), true);
		
			$pdf->Output('estado_cuenta.pdf', 'I');
		}
	}
	
	/**
	 * Registra una operacion, ya sea ingreso o salida de dinero
	 */
	public function addOperacion($id_cuenta=null){
		$id_cuenta = $id_cuenta==null? $this->input->get('id'): $id_cuenta;
		
		$id_mov = BDUtil::getId();
		$data = array(
			'id_movimiento' => $id_mov,
			'id_cuenta' => $id_cuenta,
			'fecha' => $this->input->post('dfecha'),
			'concepto' => $this->input->post('dconcepto'),
			'monto' => $this->input->post('dmonto'),
			'tipo' => $this->input->post('dtipo')
		);
		if($this->input->post('did_actor') != ''){
			($this->input->post('dtipo') == 'en')? 
				$data['id_cliente'] = $this->input->post('did_actor'): 
				$data['id_proveedor'] = $this->input->post('did_actor');
		}
		
		$this->db->insert('banco_movimientos', $data);
		
		if($this->input->post('dtipo') == 'sa' && $this->input->post('dforma_pago') == 'cheque'){
			$this->load->library('cheque');
			$pdf = new Cheque('P', 'mm', 'Letter');
			$pdf->generaCheque($this->input->post('dactor'), $this->input->post('dmonto'), $this->input->post('dfecha'));
			exit;
		}else
			return array(true, '');
	}
	
	/**
	 * Elimina una operacion de los estados de cuenta
	 */
	public function eliminaOperacion(){
		$this->db->delete('banco_movimientos', "id_movimiento = '".$_GET['id']."'");
		return array(true, '');
	}
}